/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.app.dao;

import edu.app.persistence.Utilisateur;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author esprit
 */
// Implémentation  spécifque de IDAO<T> correspondant à la classe persistante Utilisateur
// hérite de la connection
// ici, on fournit les implémentations des méthodes CRUD
public class UtilisateurDAO extends IDAO<Utilisateur> {
    
    
    //la méthode doit retourner un objet de type Utilisateur à partir d'un int "id" (passé en paramètre)
    //l'object en question sera construit à partir des données recupérées à partir de la table T_EMPLOYEE et plus précisement à partir de la ligne dont le champs ID(INTEGER) correspond à id(int)
    //retourne null si la table T_EMPLOYEE ne contient pas une telle ligne
    @Override
    public Utilisateur find(String login) {
        String sql = "SELECT * FROM UTILISATEUR WHERE LOGIN=?"; //sql à compléter
        Utilisateur found = null; // Utilisateur à trouver (à partir de la base)
        PreparedStatement preparedStatement = null;//chargé d'exécuter le sql, une fois complété
        ResultSet resultSet = null;// chargé de récupérer les données retournées par la base

        try {
            preparedStatement = connection.prepareStatement(sql);//la connection prépare le preparedStatement
            preparedStatement.setString(1, login);// on remplace le premier ? par id
            resultSet = preparedStatement.executeQuery(); //le preparedStatement exécute le sql paramètré (executeQuery() suppose un retour)
                                                          //retour = données de la base type ID, FIRSTNAME, LASTNAME
                                                          //le retour est récupéré dans le resultSet
            System.out.println(sql);
            if (resultSet.next()) {//on pointe sur la première ligne du resultSet s'il y en a
                //on instancie l'objet found de type Utilisateur à partir des données récupérées du resultSet
                //la récuprération se fait par type (getInt/getString) et par label de colonne ID/LASTNAME/FIRSTNAME
                found = new Utilisateur(resultSet.getString("LOGIN"), resultSet.getString("MOTDEPASSE"), resultSet.getString("EMAIL"));
            }


        } catch (SQLException ex) {
            Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, "find utilisateur failed", ex);
        } finally {

            //on libère les ressources : resultSet et preparedStatement
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
            } catch (SQLException ex) {
                Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, "free resourses failed", ex);
            }
        }
        return found;
    }

    //la méthode doit insérer une ligne dans la table T_EMPLOYEE
    //à partir des attributs de l'objet employee passés en paramètre, si une telle ligne n'existe pas  
    @Override
    public void create(Utilisateur e) {
        
        if (find(e.getLogin()) == null) { // on teste si la ligne avec l'ID de l'objet employee passé en paramètre existe
                                              // pour cela on utilise la methode find(int) implémentée ci-dessus
                                              //si cette ligne n'existe pas, on procède à son insertion
            
            String sql = "INSERT INTO UTILISATEUR (LOGIN, MOTDEPASSE, EMAIL) VALUES (?,?,?)";//du sql à compléter
            PreparedStatement preparedStatement = null;//chargé d'exécuter le sql, une fois complété
            try {
                preparedStatement = connection.prepareStatement(sql);//la connection prépare le preparedStatement
                preparedStatement.setString(1, e.getLogin());// on remplace le premier ? par employee.getId()
                preparedStatement.setString(2, e.getMotdepasse());// on remplace le deuxième ? par employee.getFirstname()
                preparedStatement.setString(3, e.getEmail());// on remplace le troisème ? par employee.getLastname()
                preparedStatement.executeUpdate(); //le preparedStatement exécute le sql paramètré (executeUpdate() ne suppose pas de retour) 
                                                //retour = données de la base type ID, FIRSTNAME, LASTNAME
                System.out.println(sql);
            } catch (SQLException ex) {
                Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, "insert failed", ex);
            } finally {
                //libération des ressources :preparedStatement
                try {
                    if (preparedStatement != null) {
                        preparedStatement.close();
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, "free resourses failed", ex);
                }
            }
        }    

        
    }

    

    //la methode doit mettre à jour la ligne de la table T_EMPLOYEE correspondant à l'objet
    //employee passé en paramètre, si cette ligne existe bien sûr.
    @Override
    public void update(Utilisateur e) {
        if (find(e.getLogin()) != null) { // on teste si la ligne avec l'ID de l'objet employee passé en paramètre existe
                                              // pour cela on utilise la methode find(int) implémentée ci-dessus
                                              //si cette ligne existe, on procède à sa mise à jour

            String sql = "UPDATE UTILISATEUR SET MOTDEPASSE=?, EMAIL=? WHERE LOGIN=?";//sql à compléter
            PreparedStatement preparedStatement = null;//chargé d'exécuter le sql, une fois complété
            try {
                preparedStatement = connection.prepareStatement(sql);//la connection prépare le preparedStatement
                preparedStatement.setString(1, e.getMotdepasse());// on remplace le premier ? par employee.getFirstname()
                preparedStatement.setString(2, e.getEmail());// on remplace le deuxième ? par employee.getLastname()
                preparedStatement.setString(3, e.getLogin());// on remplace le troisème ? par employee.getId()
                preparedStatement.executeUpdate();//le preparedStatement exécute le sql paramètré (executeUpdate() ne suppose pas de retour)
                                                  //retour = données de la base type ID, FIRSTNAME, LASTNAME
                System.out.println(sql);
            } catch (SQLException ex) {
                Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, "update failed", ex);
            } finally {
                //libération des ressources :preparedStatement
                try {
                    if (preparedStatement != null) {
                        preparedStatement.close();
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, "free resourses failed", ex);
                }
            }
        }

    }
    
    //la methode doit supprimer la ligne de la table T_EMPLOYEE correspondant à l'objet
    //employee passé en paramètre, si une telle ligne existe bien
    @Override
    public void delete(Utilisateur e) {
        if (find(e.getLogin()) != null) { // on teste si la ligne avec l'ID de l'objet employee passé en paramètre existe
                                              // pour cela on utilise la methode find(int) implémentée ci-dessus
                                              //si cette ligne existe, on procède à sa suppression

            String sql = "DELETE FROM UTILISATEUR WHERE LOGIN=?";//sql à compléter
            PreparedStatement preparedStatement = null;//chargé d'exécuter le sql, une fois complété
            try {
                preparedStatement = connection.prepareStatement(sql);//la connection prépare le preparedStatement
                preparedStatement.setString(1, e.getLogin());// on remplace le premier ? par employee.getId()
                preparedStatement.executeUpdate();//le preparedStatement exécute le sql paramètré (executeUpdate() ne suppose pas de retour) 
                                                  //retour = données de la base type ID, FIRSTNAME, LASTNAME
                System.out.println(sql);
            } catch (SQLException ex) {
                Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, "delete failed", ex);
            } finally {
                try {
                    if (preparedStatement != null) {
                        preparedStatement.close();
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, "free resourses failed", ex);
                }
            }

        }

    }
    // cette méthode retourne une liste "List<Utilisateur>" construite à partir de tous les enregistrements de la table T_EMPLOYEE
    @Override
    public List<Utilisateur> findAll() {
        List<Utilisateur> list = new ArrayList<Utilisateur>();//on instancie une liste  d'employés (vide)
                                                        // Interface List<Utilisateur>
                                                        // Implémentation ArrayList<Utilisateur>
        String sql = "SELECT * FROM UTILISATEUR";//script sql "complet"
                                                // rq: aucun n'est paramétrage requis
        Statement statement = null; //chargé d'exécuter le script sql
        ResultSet resultSet = null; // chargé de récupérer les données retournées par la base
        
        try {
            statement = connection.createStatement(); //la connection crée le statement
            resultSet = statement.executeQuery(sql);  //le preparedStatement exécute le sql  (executeQuery() suppose un retour)
                                                      //retour = données de la base type ID, FIRSTNAME, LASTNAME
                                                      //le retour est récupéré dans le resultSet
            System.out.println(sql);
            while (resultSet.next()) {//parcours du resultSet ligne par ligne
                //à chaque itération, on instancie un objet de type Utilisateur à partir des données récupérées du resultSet et on le rajoute à la liste
                //la récuprération se fait par type (getInt/getString) et par label de colonne ID/LASTNAME/FIRSTNAME
                list.add(new Utilisateur(resultSet.getString("LOGIN"), resultSet.getString("MOTDEPASSE"), resultSet.getString("EMAIL")));
            }


        } catch (SQLException ex) {
            Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, "find all employees failed", ex);
        } finally {
            //on libère les ressources : resultSet et preparedStatement
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException ex) {
                Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, "free resourses failed", ex);
            }
        }
        return list;
    }

    public boolean authentification(String login ,String motdepasse){
     boolean test = false ;
       Utilisateur found  = null;
       String sql = "SELECT LOGIN, MOTDEPASSE FROM utilisateur where login=?";

            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
        try {

            preparedStatement = connection.prepareStatement(sql);
             preparedStatement.setString(1,login);
            resultSet = preparedStatement.executeQuery();
            System.out.println(sql);
             if (resultSet.next()) {
           found = new Utilisateur(resultSet.getString("login"), resultSet.getString("motdepasse"));
            String l = found.getLogin();
            String  m = found.getMotdepasse();
            if  ((l.equals(login)) && (m.equals(motdepasse))){
            test = true;}
            }

 else {test = false;}

        } catch (SQLException ex) {
            Logger.getLogger(AdministrateurDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

       return test ;

       }

    public Utilisateur Affichage_information(Utilisateur u ){
     Utilisateur found = null;
    PreparedStatement ps = null;
    ResultSet rs =  null;
    String sql="select login,motdepasse,email,nom,prenom  from utilisateur where login=?";
        try {
            ps = connection.prepareStatement(sql);
            ps.setString(1, u.getLogin());
           rs = ps.executeQuery();
           if (rs.next()){
        found  = new Utilisateur(rs.getString("login"),rs.getString("motdepasse"),rs.getString("email"),rs.getString("nom"), rs.getString("prenom"));
           }
        } catch (SQLException ex) {
            Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    return  found ;
    }

    public  void  modifier (Utilisateur u ,String login){
    PreparedStatement ps  = null;
    ResultSet rs = null;
    String sql  ="update  utilisateur set login=?,motdepasse=?,email=?,nom=?,prenom=? where login =?";
        try {
            ps = connection.prepareStatement(sql);
            ps.setString(1, u.getLogin());
            ps.setString(2, u.getMotdepasse());
            ps.setString(3, u.getEmail());
            ps.setString(4, u.getNom());
            ps.setString(5, u.getPrenom());
            ps.setString(6, login);
            ps.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

     public  void  inscrire  (Utilisateur u){
    PreparedStatement ps  = null;
    ResultSet rs = null;
    String sql  ="insert into utilisateur (login,motdepasse,email,nom,prenom) values (?,?,?,?,?)";
        try {
            ps = connection.prepareStatement(sql);
            ps.setString(1, u.getLogin());
            ps.setString(2, u.getMotdepasse());
            ps.setString(3, u.getEmail());
            ps.setString(4, u.getNom());
            ps.setString(5, u.getPrenom());
            
            ps.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(UtilisateurDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

      public boolean  auth1(String login){
       boolean test = false ;
        Utilisateur found = null ;
       String sql = "SELECT login FROM UTILISATEUR where login=?";

            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
        try {

            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, login);

            resultSet = preparedStatement.executeQuery();
            System.out.println(sql);
             if (resultSet.next()) {
            found = new Utilisateur(resultSet.getString("login"));
            String l = found.getLogin();
            if  (l.equals(login)){
            test = true;}
            }

 else {test = false;}

        } catch (SQLException ex) {
            Logger.getLogger(AdministrateurDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

       return test ;

       }
    public boolean  auth2(String motdepasse){
       boolean test = false ;
        Utilisateur found = null ;
       String sql = "SELECT motdepasse FROM UTILISATEUR where motdepasse=?";

            PreparedStatement preparedStatement = null;

            ResultSet resultSet = null;
        try {

            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, motdepasse);

            resultSet = preparedStatement.executeQuery();
            System.out.println(sql);
             if (resultSet.next()) {
            found = new Utilisateur(null,resultSet.getString("motdepasse"));
            String l = found.getMotdepasse();
            if  (l.equals(motdepasse)){
            test = true;}
            }

 else {test = false;}

        } catch (SQLException ex) {
            Logger.getLogger(AdministrateurDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

       return test ;

       }

    }

